package snake;


import java.util.LinkedList;

//目录
//该class为蛇身的设置，包括：
//使用数组创建身体
//使用getHead方法返回数组第一个元素(蛇头)：用来判断是否接触到窗体壁，身体节点，食物
//使用addBody方法在数组末尾添加新元素（蛇尾）：用于添加新的身体节点
//使用getBody方法获取蛇身体长度：用于判断用户得分
//使用move方法根据贪吃蛇移动的方法来变化它的坐标位置

class Snake {

    //使用数组创建身体
    //创建Node类型的身体数组，根据Node.java中的设置可知这是一个通过坐标组成的动态数组
    //根据List的分类可知LinkedList适用于添加元素，所以这里利用创建body对象使用linkedList动态数组
    //为了对LinkedList中的元素进行限制，使这个列表中只有Node类型的坐标元素，使用了泛型
    private LinkedList<Node> body = new LinkedList<Node>();

    //返回数组第一个元素(蛇头)
    public Node getHead(){
        return body.getFirst();

    }

    //在数组末尾添加新元素（蛇尾）
    public Node addBody(Node newBody){
        body.addLast(newBody);
        return newBody;
    }

    //获取蛇身体长度
    public LinkedList<Node> getBody(){
        return body;
    }

    //根据贪吃蛇移动的方法来变化它的坐标位置
    public Node move(Direction direction){
        Node newHead;
        //newHead为body数组中的新增的第一个元素
        //通过switch case为数组body中添加第一个元素newHead，同时移除最后一个元素节点

        switch (direction){//四种情况来设置newHead的位置
            case UP:
                newHead = new Node(body.getFirst().getX(),body.getFirst().getY()-1);
                break;
            case RIGHT:
                newHead = new Node(body.getFirst().getX()+1,body.getFirst().getY());
                break;
            case DOWN:
                newHead = new Node(body.getFirst().getX(),body.getFirst().getY()+1);
                break;
            case LEFT:
                newHead = new Node(body.getFirst().getX()-1,body.getFirst().getY());
                break;
            default:
                newHead = null;
        }
        body.add(0,newHead);//添加第一个节点
        return body.removeLast();//返回删除最后一个节点
    }
}
